package Test_1030;

import java.lang.reflect.Array;
import java.util.Arrays;

/**
 * Created with Intellij IDEA
 * Description:
 * User: 星辰
 * Dare: 2024-10-30
 * Time: 22:12
 */
public class MyArrayList implements IList{
    public int[] array;
    //默认容量大小
    //这个为常量，所以可以使用static final
    public static final int DEFULATE_CAPACITY=10;
    //以占用的数组空间大小
    public int usedsize;

    public MyArrayList() {
        this.array = new int[DEFULATE_CAPACITY];
    }
    //查看是否已满：使用空间==空间大小
    public boolean isFull(){
        return this.usedsize==array.length;
    }
    //扩容：使用Arrays.copyOf
    public void grows(){
        this.array= Arrays.copyOf(this.array,
                2*this.array.length);
    }
    //展示
    public void display(){
        for (int i = 0; i < usedsize; i++) {
            System.out.print(array[i]+" ");
        }
    }
    @Override
    public void add(int data) {
        //如果满了，进行扩容
        if(isFull()){
            grows();
        }
        //数组下标由0开始，在增加一个元素的时候，其下标在第usedsize的位置上
        array[usedsize]=data;
        usedsize++;
    }
    //throws：其提醒作用，可能存在的异常
    public void checkPos(int pos) throws PosIllegal{
        //如果下标位置不合法，报错
        if(pos < 0 || pos > usedsize){
            throw new PosIllegal("位置不合法！！！");
        }
    }
    @Override
    public void add(int pos, int data) {
        try{
            checkPos(pos);
            if(isFull()){
                grows();
            }
            for (int i = usedsize-1; i >=pos ; i--) {
                array[i+1]=array[i];
            }
            array[pos]=data;
            usedsize++;
        }catch (PosIllegal e){
            System.out.println("下标插入位置不合法");
            e.printStackTrace();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    @Override
    public void remove(int toRemove) {
       try{
           checkEmpty();
           //获取下标
           int pos=indexOf(toRemove);
           if(pos==-1){
               System.out.println("没有该元素，移除失败");
               return;
           }
           //从前往后，将后面的元素向前移动
           //i是小于usedsize-1就好,因为当i=usedsize-2
           //将usedsize-1中的元素移到了usedsize-2中
           for (int i = pos; i < usedsize-1; i++) {
                  array[i]=array[i+1];
           }
           usedsize--;
       }catch (EmptyException e){
           System.out.println("顺序表为空");
           e.printStackTrace();
       }catch(Exception e){
           e.printStackTrace();
       }
    }

    @Override
    public void clear() {
        this.usedsize=0;
    }

    @Override
    public boolean contains(int toFind) {
        for (int i = 0; i < usedsize; i++) {
            if(array[i]==toFind){
                return true;
            }
        }
        return false;
    }
    public void checkPos2(int pos) throws PosIllegal{
        if(pos < 0 || pos >= usedsize){
            throw new PosIllegal("位置不合法！！！");
        }
    }
    public void checkEmpty() throws EmptyException{
        if(usedsize==0){
            throw new EmptyException("顺序表为空");
        }
    }
    @Override
    public int get(int pos) {
        try {
            checkEmpty();
            checkPos2(pos);
            return array[pos];
        }catch (PosIllegal e){
            System.out.println("Pos位置不合法");
            e.printStackTrace();
        }catch (EmptyException e){
            System.out.println("顺序表为空");
            e.printStackTrace();
        }catch (Exception e){
            e.printStackTrace();
        }
        return -1;
    }

    @Override
    public int indexOf(int toFind) {
        if(contains(toFind)){
            for (int i = 0; i < usedsize; i++) {
                if(array[i]==toFind){
                    return i;
                }
            }
        }
        return -1;
    }

    @Override
    public void set(int pos, int value) {
        try{
            checkEmpty();
            checkPos2(pos);
            array[pos]=value;
        }catch (EmptyException e){
            System.out.println("顺序表为空");
            e.printStackTrace();
        }catch (PosIllegal e){
            System.out.println("下标位置不合法");
            e.printStackTrace();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
